package com.estore.network;

import com.estore.model.Product;
import com.estore.service.ProductService;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.List;

/**
 * 商城服务器：管理业务逻辑和数据，处理客户端请求
 */
public class EStoreServer {
    // 服务器端口（固定为8888）
    private static final int SERVER_PORT = 8888;
    // 业务逻辑由服务器统一管理
    private final ProductService productService = new ProductService();

    public static void main(String[] args) {
        new EStoreServer().startServer();
    }

    /**
     * 启动服务器，监听端口并处理客户端连接
     */
    private void startServer() {
        try (ServerSocket serverSocket = new ServerSocket(SERVER_PORT)) {
            System.out.println("=== 商城服务器已启动，监听端口：" + SERVER_PORT + " ===");
            // 无限循环等待客户端连接（支持多客户端，每个连接启动独立线程处理）
            while (true) {
                Socket clientSocket = serverSocket.accept(); // 阻塞等待连接
                System.out.println("=== 新客户端连接：" + clientSocket.getInetAddress() + ":" + clientSocket.getPort() + " ===");
                // 启动新线程处理客户端请求（避免单客户端阻塞整个服务器）
                new Thread(() -> handleClient(clientSocket)).start();
            }
        } catch (IOException e) {
            System.err.println("服务器启动失败！");
            e.printStackTrace();
        }
    }

    /**
     * 处理单个客户端的请求
     * @param clientSocket 客户端Socket连接
     */
    private void handleClient(Socket clientSocket) {
        // try-with-resources 自动关闭流和Socket
        try (ObjectInputStream ois = new ObjectInputStream(clientSocket.getInputStream());
             ObjectOutputStream oos = new ObjectOutputStream(clientSocket.getOutputStream())) {

            // 1. 读取客户端发送的请求（约定为字符串指令）
            String request = (String) ois.readObject();
            System.out.println("收到客户端请求：" + request);

            // 2. 根据请求指令处理业务逻辑
            Object response = handleRequest(request);

            // 3. 向客户端返回响应数据
            oos.writeObject(response);
            oos.flush(); // 强制刷新缓冲区，确保数据及时发送
            System.out.println("请求处理完成，已返回响应");

        } catch (IOException | ClassNotFoundException e) {
            System.err.println("客户端连接异常：" + e.getMessage());
        } finally {
            try {
                clientSocket.close();
                System.out.println("客户端连接已关闭\n");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 解析请求指令，调用对应业务方法
     * @param request 客户端请求指令
     * @return 响应数据
     */
    private Object handleRequest(String request) {
        switch (request) {
            case "GET_ALL_PRODUCTS":
                return productService.getAllProducts();
            // 新增：处理按ID查询商品的请求（格式：GET_PRODUCT_BY_ID:p001）
            case String s when s.startsWith("GET_PRODUCT_BY_ID:"):
                String productId = s.split(":", 2)[1]; // 截取商品ID
                return productService.findProductById(productId);
            default:
                return "错误：未知请求指令！";
        }
    }
}